Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

JOIN в MySQL: вопрос к документации (Maus)
Author Message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Feb 20, 2006 9:57 pm (написано за 10 минут 28 секунд)
   Post subject: JOIN в MySQL: вопрос к документации
Reply with quote

В документации (dev.mysql.com/doc/refman/4.1/en/join.html) сказано:
Quote:
You should generally not have any conditions in the ON part that are used to restrict which rows you want in the result set, but rather specify these conditions in the WHERE clause. There are exceptions to this rule.
...
The ON conditional is any conditional expression of the form that can be used in a WHERE clause
//примерный перевод
Quote:
Вообще говоря, настоятельно не рекомендуется в части ON указывать условия, которые ограничивают результирующий вывод - предпочитительнее вынести их в блок WHERE. Из этого правила есть исключения.
...
Условие в ON - это любое условное выражение в форме, используемой в блоке WHERE
Эксперимент показывает ,что если в части ON стоят условия, связанные лишь с одной из таблиц, то они напрочь игнорируются, например:
Code (SQL): скопировать код в буфер обмена
SELECT foo.`id`, bind_foo.`id` FROM foo LEFT JOIN bind_foo AS bf ON (bf.id IS NOT NULL AND bf.bind_id=foo.id)
в столбце bind_foo.id через раз болтается NULL.
Вопрос - это баг или я что-то проглядел?

P.S. Заодно:
Maus wrote:
Из этого правила есть исключения
они где-нибудь описаны, эти исключения??
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Thu Mar 09, 2006 2:36 pm (спустя 16 дней 16 часов 38 минут; написано за 2 минуты 27 секунд)
   Post subject:
Reply with quote

Какая версия MySQL?
Они там в MySQL так все перекорежили, что половина запросов с JOIN-ами, работающая в 4.x, в 5.x работать отказывается.
Maus wrote:
Вопрос - это баг или я что-то проглядел?
Скорее всего второе. Штука в том, что LEFT JOIN никак не может органичить выборку, она может только добавить новые строки, но не удалить: если A и B - таблицы, то count(A LEFT JOIN B ON X) >= count(A)*count(B) для любого X. Поэтому-то bf.id IS NOT NULL и не срабатывает. Попробуй в WHERE его запихнуть.
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Thu Mar 09, 2006 2:59 pm (спустя 23 минуты; написано за 2 минуты 46 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Какая версия MySQL?
4.1.16-nt-max
Еслди справедливо
Дмитрий Котеров wrote:
половина запросов с JOIN-ами, работающая в 4.x, в 5.x работать отказывается
В смысле они ошибочными становятся? А какие причины отказа чаще всего?
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Thu Mar 09, 2006 4:53 pm (спустя 1 час 54 минуты; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

Насколько я понимаю, изменился приоритет операторов ",", JOIN и LEFT JOIN, а для восстановления прежнего приоритета надо использовать скобки. Они говорят, что все сделано в соответствии с каким-то там стандартом - что ж, охотно верю.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML